package com.spider.common.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @description: reids配置类
 * @Author: Marver
 * @date: 2018-04-18 10:21
 **/
@Configuration
public class RedisCacheConfiguration {

    private static Logger logger = LoggerFactory.getLogger(RedisCacheConfiguration.class);

    @Value("${jedis.host}")
    private String HOST;
    @Value("${jedis.port}")
    private int PORT;
    @Value("${jedis.password}")
    private String PASSWORD;
    //可用连接实例的最大数目，默认值为8；
    //如果赋值为-1，则表示不限制；如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)。
    @Value("${jedis.max-active}")
    private int MAX_ACTIVE;
    //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例，默认值也是8。
    @Value("${jedis.max-idle}")
    private int MAX_IDLE;
    @Value("${jedis.min-idle}")
    private int MIN_IDLE;
    //等待可用连接的最大时间，单位毫秒，默认值为-1，表示永不超时。如果超过等待时间，则直接抛出JedisConnectionException；
    @Value("${jedis.max-wait}")
    private int MAX_WAIT;
    @Value("${jedis.timeout}")
    private int TIMEOUT;
    //在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的；
    @Value("${jedis.test-on-borrow}")
    private boolean TEST_ON_BORROW;
    /**
     * 初始化Redis连接池
     */
    @Bean
    public JedisPool redisPoolFactory() {
        try {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(MAX_ACTIVE);
            config.setMaxIdle(MAX_IDLE);
            config.setMinIdle(MIN_IDLE);
            config.setMaxWaitMillis(MAX_WAIT);
            config.setTestOnBorrow(TEST_ON_BORROW);
            if(StringUtils.isEmpty(PASSWORD)){
                PASSWORD = null ;
            }
            return new JedisPool(config, HOST, PORT,TIMEOUT,PASSWORD);
        } catch (Exception e) {
            logger.error("redis连接失败"+e.getMessage());
            e.printStackTrace();
        }
        return null;
    }
}
